一.一个最小的Flask应用

from flask import Flask
app = Flask(__name__)
#app是程序实例,一个项目只能有一个程序实例
@app.route('/')
#路由装饰器
def hello_world():
#视图函数
    return 'Hello World!'    
    #返回一个字符串
if __name__ == '__main__':
    app.run()

把程序保存为hello.py 用Python解释器运行

$ python hello.py
    * Running on  http://127.0.0.1:5000/

访问 http://127.0.0.1:5000/ ,会看见 Hello World 问候。欲关闭服务器,按 Ctrl+C。

这段代码做了什么?

  1. 首先,我们导入了 Flask 类。这个类的实例将会是我们的 WSGI 应用程序
    2.接下来,我们创建一个该类的实例,第一个参数是应用模块或者包的名称。 如果你使用单一的模

块(如本例),你应该使用 name ,因为模块的名称将会因其作为单独应用启动还是作为模
块导入而有不同( 也即是 '__main__' 或实际的导入名)。这是必须的,这样 Flask 才知道到哪
去找模板、静态文件等等。 详情见 Flask的文档。

  1. 然后,我们使用 route() 装饰器告诉 Flask 什么样的URL 能触发我们的函数。
    4.这个函数的名字也在生成 URL 时被特定的函数采用,这个函数返回我们想要显示在用户浏览器中

的信息。
5.最后我们用 run() 函数来让应用运行在本地服务器上。 其中 if name =='__main__': 确保服务器
只会在该脚本被 Python 解释器直接执行的时候才会运行,而不是作为模块导入的时候。

(1)调试模式

如果你启用了调试支持,服务器会在代码修改后自动重新载入,并在发生错误时提供一个相当有用的调试器。
有两种途径来启用调试模式:
一种是直接在应用对象上设置:

app.debug = True
app.run()

另一种是作为 run 方法的一个参数传入:

app.run(debug=True)

两种方法的效果完全相同。
【注意】

  • 交互式调试器绝对不能用于生产环境。

(2)路由装饰器

@app.route('/')
def index():
    return 'Index'
    
@app.route('/hello/')
def hello():
    return '<h1>Hello world!</h1>'

这个函数的返回值称为响应,是客户端接收到的内容。
像 index() 这样的函数称为视图函数(view function)。视图函数返回的响应可
以是包含HTML 的简单字符串,也可以是复杂的表单。

(3)变量规则

@app.route('/user/<name>')
def showUserName(name):
    return "User %s" %name
    
@app.route('/post/<int:post_id>')
def showPostId(post_id):
    return "Post %d" %post_id

Flask 支持在路由中使用 int、 float 和 path 类型。path 类型也是字符串,但
不把斜线视作分隔符,而将其当作动态片段的一部分。
int | 接受整数
float | 接受浮点数
path | 和默认的相似,但也接受斜线
变量规则的意义:处理动态信息。
【注意】

  1. app.route()函数中中括号里的是变量名,必须与视图函数的形参名一致!

  2. 如果是int或float类型,不能直接return!必须要转换为字符串格式才可以,否
    则会报错:TypeError: 'int' object is not callable

(4)唯一 URL / 重定向行为

@app.route('/about/') # 建议用法
# @app.route('/about') # 不建议用法
def about():
    return 'The about page'

虽然它们看起来着实相似,但它们结尾斜线的使用在 URL 定义 中不同:

- 第一种情况中,指向 about的规范 URL 尾端有一个斜线。这种感觉很像在文件系
统中的文件夹。访问一个结尾不带斜线的 URL 会被 Flask 重定向到带斜线的规范
URL 去。因此, 强烈建议统一加上斜线!
- 第二种情况的 URL 结尾不带斜线,类似 UNIX-like 系统下的文件的路径名。访问
结尾带斜线的URL 会产生一个 404 “Not Found” 错误。

这个行为使得在遗忘尾斜线时,允许关联的 URL 接任工作,与 Apache 和其它的服
务器的行为并无二异。此外,也保证了 URL 的唯一,有助于避免搜索引擎索引同一
个页面两次。

(5)重定向和错误

  • 用 redirect() 函数把用户重定向到其它地方。

  • 用 abort() 函数放弃请求并返回错误代码。例如:

@app.route('/redir/')
def redir():
    return redirect('/login/')
@app.route('/login/')
def login():
    abort(401)

用户会从/redir/重定向到一个不能访问的页面 (401 意味着禁止访问)。

(6)构造URL

用 url_for()来给指定的函数生成(构造) URL。它接受函数名作为第一个参数,
也接受对应 URL 规则的变量部分的命名参数。例如:

@app.route('/world/')
def world():
    # return redirect('/hello/')
    # return redirect(url_for('hello'))
    # return redirect(url_for('showUserName',name = 'liusheng'))
    return redirect(url_for('showPostId', post_id = 100)) 
    # 注意这里的100可以是字符串也可以是整型

使用url_for()生成 URL 而非在模板中硬编码的好处:

1. 反向构建通常比硬编码的描述性更好。允许一次性修改 URL,而不用到处边找边改。
2. URL 构建会转义特殊字符和 Unicode 数据,免去你很多麻烦。

(7)使用Flask-Script支持命令行选项

Flask-Script 是一个 Flask 扩展,为 Flask 程序添加了一个命令行解析器。
Flask-Script 自带了一组常用选项,而且还支持自定义命令。

Flask-Script 扩展使用 pip 安装:

(venv) $ pip install flask-script

把命令行解析功能添加到 hello.py 程序中时需要修改的地方:

from flask_script import Manager
manager = Manager(app)
if __name__ == '__main__':
    manager.run()

修改之后程序可以使用一组基本命令行选项来启动 Web 服务器。:

python hello.py runserver
--host HOST  |设置host为 HOST
--port PORT  |设置port为 PORT
-d           |设置以debug模式运行而非run模式
-r           |设置自动重新载入(app.debug为True)

标准命令:

python hello.py runserver -d -r --host 0.0.0.0
python hello.py runserver -d -r --port:5001

netScorpion
18 声望2 粉丝

愿历尽千帆,归来仍少年。